package com.demo;

import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY;
import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_RETRIEVE_SIZE_KEY;

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class McpTest {
    @Resource
    private ChatClient.Builder chatClientBuilder;
    @Resource
    private ToolCallbackProvider tools;
    //配置好进行mcp服务的chatClient
    @Resource
    private ChatClient chatClient;

    //查看有哪些mcp工具可以使用
    @Test
    public void test_tool() {
        String userInput = "有哪些工具可以使用";
        ChatClient chatClient = chatClientBuilder
                .defaultTools(tools)
                .defaultOptions(OpenAiChatOptions.builder()
                        .model("gpt-3.5-turbo")
                        .build())
                .build();
        System.out.println("question:" + userInput);
        System.out.println("answer:" + chatClient.prompt(userInput).call().content());
    }

    //测试获取电脑配置并输出文件的mcp
    @Test
    public void test_workflow() {
        String userInput = "获取电脑配置，在 D:\\test 文件夹下，创建 电脑.txt";
        ChatClient chatClient = chatClientBuilder
                .defaultTools(tools)
                .defaultOptions(OpenAiChatOptions.builder()
                        .model("gpt-3.5-turbo")
                        .build())
                .build();
        System.out.println("question:" + userInput);
        System.out.println("answer:" + chatClient.prompt(userInput).call().content());
    }

    //测试发送微信公众号
    @Test
    public void test_weixin() {
        String userInput = """
            发送微信公众号消息通知，平台：CSDN、主题：【Java面试】大厂面试官vs水货程序员的爆笑对决、描述：一篇关于Java核心技术面试的趣味文章，包含面试官提问和水货程序员搞笑回答，最后附详细技术解析。、跳转地址：https://blog.csdn.net/qq_73999886/article/details/123456789
            """;
        System.out.println("\n>>>QUESTION: " + userInput);
        // 确保你的chatClient能够正确解析这种格式
        String response = chatClient.prompt(userInput).call().content();
        System.out.println("\n>>>ASSISTANT: " + response);
    }

    //测试发帖+发送微信公众号（一体）
    @Test
    public void test_csdn_weixin() {
        String userInput = """
                我需要你帮我生成一篇文章，要求如下；

                1. 场景为互联网大厂java求职者面试
                2. 面试管提问 Java 核心知识、JUC、JVM、多线程、线程池、HashMap、ArrayList、Spring、SpringBoot、MyBatis、Dubbo、RabbitMQ、xxl-job、Redis、MySQL、Linux、Docker、设计模式、DDD等不限于此的各项技术问题。
                3. 按照故事场景，以严肃的面试官和搞笑的水货程序员谢飞机进行提问，谢飞机对简单问题可以回答，回答好了面试官还会夸赞。复杂问题胡乱回答，回答的不清晰。
                4. 每次进行3轮提问，每轮可以有3-5个问题。这些问题要有技术业务场景上的衔接性，循序渐进引导提问。最后是面试官让程序员回家等通知类似的话术。
                5. 提问后把问题的答案，写到文章最后，最后的答案要详细讲述出技术点，让小白可以学习下来。

                根据以上内容，不要阐述其他信息，请直接提供；文章标题、文章内容、文章标签（多个用英文逗号隔开）、文章简述（100字）

                将以上内容发布文章到CSDN。

                之后进行，微信公众号消息通知，平台：CSDN、主题：为文章标题、描述：为文章简述、跳转地址：从发布文章到CSDN获取 url
                """;
        System.out.println("\\n>>>QUESTION: " + userInput);
        System.out.println("\\n>>>ASSISTANT: " + chatClient.prompt(userInput).call().content());
    }

    //测试发帖+发送微信公众号（使用上下文）
    //分两次发送，涉及上下文
    @Test
    public void test_csdn_weixin_context() {
        //csdn
        String userInput1 = """
                        我需要你帮我生成一篇文章，要求如下；

                1. 场景为互联网大厂java求职者面试
                2. 面试管提问 Java 核心知识、JUC、JVM、多线程、线程池、HashMap、ArrayList、Spring、SpringBoot、MyBatis、Dubbo、RabbitMQ、xxl-job、Redis、MySQL、Linux、Docker、设计模式、DDD等不限于此的各项技术问题。
                3. 按照故事场景，以严肃的面试官和搞笑的水货程序员谢飞机进行提问，谢飞机对简单问题可以回答，回答好了面试官还会夸赞。复杂问题胡乱回答，回答的不清晰。
                4. 每次进行3轮提问，每轮可以有3-5个问题。这些问题要有技术业务场景上的衔接性，循序渐进引导提问。最后是面试官让程序员回家等通知类似的话术。
                5. 提问后把问题的答案，写到文章最后，最后的答案要详细讲述出技术点，让小白可以学习下来。

                根据以上内容，不要阐述其他信息，请直接提供；文章标题、文章内容、文章标签（多个用英文逗号隔开）、文章简述（100字）

                将以上内容发布文章到CSDN。
                        """;
        System.out.println("\\n>>>QUESTION: " + userInput1);
        System.out.println("\\n>>>ASSISTANT: " + chatClient.prompt(userInput1)
                .advisors(advisor -> advisor
                        //从上下文中检索聊天室存储器会话id的键。
                        .param(CHAT_MEMORY_CONVERSATION_ID_KEY, "1001")
                        //从上下文中检索聊天室存储器响应大小的键。
                        .param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100))
                .call().content());
        //weixin
        String userInput2 = """
                 之后进行，微信公众号消息通知，平台：CSDN、主题：为文章标题、描述：为文章简述、跳转地址：从发布文章到CSDN获取 url
                """;
        System.out.println("\\n>>>QUESTION: " + userInput2);
        System.out.println("\\n>>>ASSISTANT: " + chatClient.prompt(userInput2)
                .advisors(advisor -> advisor
                        //从上下文中检索聊天室存储器会话id的键。
                        .param(CHAT_MEMORY_CONVERSATION_ID_KEY, "1001")
                        //从上下文中检索聊天室存储器响应大小的键。
                        .param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100))
                .call().content());
    }
}
